package com.gitee.srurl.core.api;

import com.gitee.srurl.core.dto.DataModel;
import com.gitee.srurl.core.dto.RefreshRemainRecordDTO;
import com.gitee.srurl.core.dto.result.ShortUrlResultDTO;

import java.util.Date;
import java.util.List;

/**
 * 数据存储方式
 *
 * @author zxw
 * @date 2023/4/19 22:18
 */
public interface IDataStore {

    /**
     * 保存数据
     *
     * @param dataModel
     * @return
     */
    boolean save(DataModel dataModel);

    /**
     * 更新数据
     *
     * @param dataModel
     * @return
     */
    boolean update(DataModel dataModel);

    /**
     * 反查原始url
     *
     * @param shortId 短网站id
     * @return 原始地址
     */
    ShortUrlResultDTO peggingOriginUrl(String shortId);

    /**
     * 短链剩余(过期时间、剩余请求次数)数据
     *
     * @param shortUrl 短链url
     * @return url数据
     */
    ShortUrlResultDTO shortUrlRemainingData(String shortUrl);

    /**
     * 短链地址是否存在并且有效
     *
     * @param shortUrl 短链地址
     * @return 短链地址是否存在
     */
    boolean shortUrlExistIfEffectivity(String shortUrl);

    /**
     * 根据原始url查询是否存在
     *
     * @param originUrl 原始url
     * @return 结果信息
     */
    ShortUrlResultDTO queryByOriginUrl(String originUrl);

    /**
     * 查询期间内短链接生成数量
     *
     * @param startDate 查询开始时间
     * @param endDate   查询结束时间
     * @return 生成数量
     */
    long getGenerateNum(Date startDate, Date endDate);

    /**
     * 获取最近一天有访问记录的数据
     * 因为默认是mysql 可以通过关联表查询处理
     * 如果选择的是非mysql作为存储，需要通过这个去获取访问记录然后在查询
     */
    List<RefreshRemainRecordDTO> getRecentOneDayHadVisitRecord();

    /**
     * 刷新可访问次数
     * @param refreshRemainRecordDTOList 需要刷新的数据列表
     */
    void refreshRecordRemainTimes(List<RefreshRemainRecordDTO> refreshRemainRecordDTOList);
}
